/*
    created: 2023/3/31
    filename: Abstract_Factory.h
    author: 李东霖
    purpose: AbstractFactory的演示代码
*/
#ifndef _ABSTRACT_FACTORY_H_
#define _ABSTRACT_FACTORY_H_

//抽象基类AbstractProductA，代表产品A的抽象
class AbstractProductA
{
public:
    AbstractProductA() = default;
    virtual ~AbstractProductA() = default;
};

//派生类ConcreteProductA1，继承AbstractProductA，代表产品A的第一种实现
class ConcreteProductA1: public AbstractProductA
{
public:
    ConcreteProductA1();
    virtual ~ConcreteProductA1();   
};

//派生类ConcreteProductA2，继承AbstractProductA，代表产品A的第二种实现
class ConcreteProductA2: public AbstractProductA
{
public:
    ConcreteProductA2();
    virtual ~ConcreteProductA2();   
};


//抽象基类AbstractProductB，代表产品B的抽象
class AbstractProductB
{
public:
    AbstractProductB() = default;
    virtual ~AbstractProductB() = default;
};

//派生类ConcreteProductB1，继承AbstractProductB，代表产品B的第一种实现
class ConcreteProductB1: public AbstractProductB
{
public:
    ConcreteProductB1();
    virtual ~ConcreteProductB1();   
};

//派生类ConcreteProductB2，继承AbstractProductB，代表产品B的第二种实现
class ConcreteProductB2: public AbstractProductB
{
public:
    ConcreteProductB2();
    virtual ~ConcreteProductB2();   
};

//抽象基类AbstractFactory,工厂的抽象，生产产品A和B
class AbstractFactory
{
public:
    Abstract_Factory() = default;
    virtual ~Abstract_Factory() = default;

    //纯虚方法 生产产品A和产品B
    virtual AbstractProductA* CreateProductA() = 0;
    virtual AbstractProductB* CreateProductB() = 0;
};

//工厂派生类ConcreateFactory1,继承AbstractFactory
//生产产品A和产品B的第一种实现
class ConcreateFactory1 :public AbstractFactory
{
public:
    ConcreateFactory1();
    virtual ~ConcreateFactory1();

    //重写虚方法 生产产品A和产品B的第一种实现
    virtual AbstractProductA* CreateProductA() override;
    virtual AbstractProductB* CreateProductB() override;
};

//工厂派生类ConcreateFactory2,继承AbstractFactory
//生产产品A和产品B的第二种实现
class ConcreateFactory2 :public AbstractFactory
{
public:
    ConcreateFactory2();
    virtual ~ConcreateFactory2();

    //重写虚方法 生产产品A和产品B的第二种实现
    virtual AbstractProductA* CreateProductA() override;
    virtual AbstractProductB* CreateProductB() override;
};


#endif //! _ABSTRACT_FACTORY_H_
